package com.baoyouqun.API.ik;

import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;

import java.io.StringReader;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * IKAnalyzer中文分词工具类
 * 提供单个字符串分词和列表批量分词方法（包含去重逻辑）
 */
public final class IKAnalyzerUtils {

    // 私有构造方法，禁止实例化工具类
    private IKAnalyzerUtils() {
        throw new AssertionError("工具类不允许实例化");
    }

    /**
     * 对单个字符串进行分词（去重处理）
     *
     * @param text 待分词的文本（可为null或空字符串）
     * @return 去重后的分词结果列表（空文本返回空列表，异常时返回空列表）
     */
    public static List<String> split(String text) {
        // 使用LinkedHashSet保证去重且保留分词顺序
        LinkedHashSet<String> resultSet = new LinkedHashSet<>();
        // 处理空文本：直接返回空列表
        if (text == null || text.trim().isEmpty()) {
            return new ArrayList<>(resultSet);
        }

        StringReader reader = null;
        try {
            reader = new StringReader(text);
            // 初始化IK分词器：第二个参数为true表示"智能分词"
            IKSegmenter segmenter = new IKSegmenter(reader, true);
            Lexeme lexeme;
            // 循环获取分词结果并添加到集合（自动去重）
            while ((lexeme = segmenter.next()) != null) {
                resultSet.add(lexeme.getLexemeText());
            }
        } catch (Exception e) {
            // 分词异常时返回空列表（可根据业务需求改为抛异常或记录日志）
            // e.printStackTrace();
        } finally {
            // 关闭资源，避免内存泄漏
            if (reader != null) {
                reader.close();
            }
        }
        // 转换为List返回
        return new ArrayList<>(resultSet);
    }

    /**
     * 对字符串列表进行批量分词，汇总所有分词结果（去重处理）
     *
     * @param textList 待分词的文本列表（可为null或空列表）
     * @return 所有文本的去重分词结果汇总列表（空列表返回空列表，异常时忽略错误文本）
     */
    public static List<String> splitList(List<String> textList) {
        // 处理空列表：直接返回空列表
        if (textList == null || textList.isEmpty()) {
            return new ArrayList<>();
        }

        // 遍历列表，对每个文本分词，合并所有结果并去重
        return textList.stream()
                .filter(Objects::nonNull) // 过滤null元素
                .map(IKAnalyzerUtils::split) // 对每个非空文本调用单个分词方法
                .flatMap(List::stream) // 扁平化列表
                .collect(Collectors.toCollection(LinkedHashSet::new)) // 利用LinkedHashSet去重并保留顺序
                .stream()
                .collect(Collectors.toList()); // 转换为List返回
    }
}